package com.dexter.mockinterface.controller;

import com.dexter.mockclientsdk.model.User;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

import static com.dexter.mockclientsdk.utils.SignUtils.genSign;

/**
 * 获取用户名的API【模拟接口提供方法最base位置】
 */
@RestController
@RequestMapping("name")
public class NameController {

    @GetMapping("/")
    public String getNameByGet(String name) {
        return "GET 你的名字是：" + name;
    }

    @PostMapping("/")
    public String getNameByPost(@RequestParam String name) {
        return "POST 你的名字是：" + name;
    }

    @PostMapping("/user")
    public String getUserNameByPost(@RequestBody User user, HttpServletRequest request) {
        // 在提供方法的位置校验ak、sk 信息从请求头中获取
        String accessKey = request.getHeader("accessKey");
        String nonce = request.getHeader("nonce");
        String timestamp = request.getHeader("timestamp");
        // 是将 encode 之后的 body 写进请求头的 暂时无需 decode
        String body = request.getHeader("body");
        String sign = request.getHeader("sign");
        // TODO 查验数据库校验ak
        if (!accessKey.equals("wrong")) {
            throw new RuntimeException("无权限");
        }
        // 校验随机数
        if (Long.parseLong(nonce) > 10000) {
            throw new RuntimeException("无权限");
        }
        // 校验时间戳 和当前时间不能超过5分钟
        if ((Long.parseLong(timestamp) + 5 * 60) * 1000 < System.currentTimeMillis()) {
            throw new RuntimeException("无权限");
        }
        // 校验签名
        String serverSign = genSign(body, "wrong2");
        if (!sign.equals(serverSign)) {
            throw new RuntimeException("无权限");
        }
        return "POST User 你的名字是：" + user.getUsername();
    }
}
